LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

SOC

2022/4/12

制作SD卡启动盘

本来是想要试着制作SOC的,SD卡启动盘也制作好了,但是因为很多原因没有进行到最后

这一篇是我制作启动盘的笔记,有些是按我自己的理解实现的

不一定完全对,最终该SD卡启动盘也没有经过验证

所以下述内容不一定正确,仅以此记录


SD卡启动相关知识

启动过程是一个从SD卡逐步搬移到DDR内存,并且运行启动代码进行相关的硬件初始化和软件架构的建立,最终达到运行时稳定状态。u-boot自启动,引导内核启动。



接下来开始制作启动盘!

一、SD卡分区

1.查看设备及分区

插入SD卡,输入

sudo fdisk -l

我的系统上SD卡设备节点是 /dev/sdb

包含一个分区,分区名是sdb1

2.取消所有分区挂载

我只需要删掉一个

sudo umount /dev/sdb1

3.开始分区

sudo fdisk /dev/sdb 

1.输入m查看命令,然后d删除分区

2.输入n添加新分区;接着输入p代表是主分区;然后输入1代表是第一分区;然后直接回车,代表内存从默认地方开始;然后输入+2G,代表分区大小2G。

3.输入n添加新分区;接着输入p代表是主分区;然后输入2代表是第二分区;然后直接回车,代表内存从默认地方开始;然后输入回车,代表分区大小为剩下的内存。

4.输入w保存

4.设置分区格式

先查看以下是否有两个文件

ls -l /dev/sdb*

有可能没有出现/dev/sdb2

则通过以下命令解决(其中b是block型设备文件,8是主设备号,2是辅助设备号)

mknod  /dev/sdb2  b 8 2

确认两个都有之后,设置第一个分区为FAT32格式,第二个分区为EXT3格式,并分别起名为boot和rootfs。

sudo mkfs.vfat -F 32 -n boot /dev/sdb1
sudo mkfs.ext4 -L rootfs /dev/sdb2

二、安装交叉编译器

1.下载

到网址 https://download.friendlyarm.com/nanopineo

toolchain目录下载arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz

2.创建目录并解压

这里在根目录创建

mkdir -p ~/FriendlyARM/toolchain
tar xf arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz -C ~/FriendlyARM/toolchain/

3.将编译器的路径写入PATH

用vim编辑.bashrc

vi ~/.bashrc

在末尾添加

export PATH=~/FriendlyARM/toolchain/4.9.3/bin:$PATH
export GCC_COLORS=auto

4.让写入内容生效

. ~/.bashrc

关闭命令行重新打开

5.验证

arm-linux-gcc --version

显示版本号即安装成功


三、编译准备工作

开始编译U-boot和Kernel,我将他们都放在SOC文件夹下

mkdir -p ~/SOC
cd ~/SOC

更换shell中python版本

先查看shell的Python版本是不是Python2 不然后面编译会报错

可以在shell通过以下命令查看python当前版本

我的博客里有一篇change-python-version-in-linux-shell,有讲怎么改版本

python --version

如果不是,参考该链接更改:https://www.bonbonn.shop/2021/12/08/change-python-version-in-linux-shell/


四、编译U-boot

1.下载U-boot源码

git clone https://github.com/friendlyarm/u-boot.git -b sunxi-v2017.x --depth 1

2.编译

apt-get install swig python-dev python3-dev
cd u-boot
make nanopi_h3_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
make ARCH=arm CROSS_COMPILE=arm-linux-

编译成功后会生成文件u-boot-sunxi-with-spl.bin

3.更新到SD卡

确定自己sd卡路径,如上述分区则是/dev/sdb,将文件写入

dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8

Tips:是写入了无名分区,所以是看不到的,不要惊慌。


五、编译kernel

1.下载Linux内核源码

git clone https://github.com/friendlyarm/linux.git -b sunxi-4.14.y --depth 1

2.编译

需要挺久的

apt-get install u-boot-tools
cd linux
touch .scmversion
make sunxi_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
make zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux-

编译完成后会在arch/arm/boot/目录下生成zImage,并且在arch/arm/boot/dts/目录下生成dtb文件。

3.创建文件夹作为挂载点

如上述分区则是/dev/sdb1

mkdir -p ./SD/boot
sudo mount /dev/sdb1 ./SD/boot

4.更新SD卡上的zImage和dtb文件

cp arch/arm/boot/zImage ./SD/boot
cp arch/arm/boot/dts/sun8i-*-nanopi-*.dtb ./SD/boot

5.取消挂载

sudo umount ./SD/boot


六、编译驱动模块

同上述Linux内核源码路径

1.编译

需要挺久的

cd linux
make modules ARCH=arm CROSS_COMPILE=arm-linux-

2.创建文件夹为挂载点

如上述分区则是/dev/sdb2

mkdir -p ./SD/rootfs
sudo mount /dev/sdb2 ./SD/rootfs

3.更新SD卡上rootfs的驱动模块

cd linux
make modules_install INSTALL_MOD_PATH=/media/SD/rootfs/ ARCH=arm CROSS_COMPILE=arm-linux-

有可能提示权限不够,加了sudo提示arm-linux-gcc不存在

原因是sudo超级用户的环境变量与正常的环境变量不同,而在sudo的环境变量下没有arm-linux-gcc

一种办法就是编辑sudoers文件,取消掉对PATH变量的重置

sudo vi /etc/sudoers

将其中Defaults env_reset 改成 Defaults !env_reset


然后编辑~/.bashrc

vi ~/.bashrc

添加

alias sudo="sudo env PATH=$PATH"

然后关掉命令行,重新进入对应目录执行对应操作

4.取消挂载

sudo umount ./SD/rootfs

参考:http://wiki.friendlyarm.com/wiki/index.php/Building_U-boot_and_Linux_for_H5/H3/H2%2B/zh